package com.yhsimon.rabbitmq.service;

import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.UUID;

@Service
public class OrderService {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    //fanout模式
    public void createOrder(String userid,String productid,int num){
        //1.查询商品库存
        //2.保存订单
        String orderid= UUID.randomUUID().toString();
        System.out.println("订单生产成功："+orderid);
        //3.通过MQ来完成消息的分发
        //参数1：交换机 参数2：路由key/queue队列名称   参数3：消息内容
        String exchangeName="fanout_order_exchange";
        String routingKey="";
        rabbitTemplate.convertAndSend(exchangeName,routingKey,orderid);
    }

    //direct模式
    public void createOrderDirect(String userid,String productid,int num){
        //1.查询商品库存
        //2.保存订单
        String orderid= UUID.randomUUID().toString();
        System.out.println("订单生产成功："+orderid);
        //3.通过MQ来完成消息的分发
        //参数1：交换机 参数2：路由key/queue队列名称   参数3：消息内容
        String exchangeName="direct_order_exchange";
//        String routingKey="";
        rabbitTemplate.convertAndSend(exchangeName,"email",orderid);
//        rabbitTemplate.convertAndSend(exchangeName,"sms",orderid);
        rabbitTemplate.convertAndSend(exchangeName,"message",orderid);
    }

    //topic 模式  相当于模糊匹配
    public void createOrderTopic(String userid,String productid,int num){
        //1.查询商品库存
        //2.保存订单
        String orderid= UUID.randomUUID().toString();
        System.out.println("订单生产成功："+orderid);
        //3.通过MQ来完成消息的分发
        //参数1：交换机 参数2：路由key/queue队列名称   参数3：消息内容
        String exchangeName="topic_order_exchange";
        /**
         * email    *.email.#
         * message  #.message.#
         * sms      *.sms.*
         */
        String routingKey="com.email.message.sms";
        rabbitTemplate.convertAndSend(exchangeName,routingKey,orderid);
    }

    //ttl之设置队列有效时间
    public void createOrderTTL(String userid,String productid,int num){
        //1.查询商品库存
        //2.保存订单
        String orderid= UUID.randomUUID().toString();
        System.out.println("订单生产成功："+orderid);
        //3.通过MQ来完成消息的分发
        //参数1：交换机 参数2：路由key/queue队列名称   参数3：消息内容
        String exchangeName="ttl_direct_exchange";
        String routingKey="ttl";
        rabbitTemplate.convertAndSend(exchangeName,routingKey,orderid);
    }

    //ttl之设置消息有效时间
    public void createOrderTTLMessage(String userid,String productid,int num){
        //1.查询商品库存
        //2.保存订单
        String orderid= UUID.randomUUID().toString();
        System.out.println("订单生产成功："+orderid);
        //3.通过MQ来完成消息的分发
        //参数1：交换机 参数2：路由key/queue队列名称   参数3：消息内容
        String exchangeName="ttl_direct_exchange";
        String routingKey="ttlMessage";

        //给消息设置过期时间
        MessagePostProcessor messagePostProcessor = message -> {
            message.getMessageProperties().setExpiration("5000");
            message.getMessageProperties().setContentEncoding("UTF-8");
            return message;
        };
        rabbitTemplate.convertAndSend(exchangeName,routingKey,orderid,messagePostProcessor);
    }

}
